
function createInvokey(value) {
  const invoker = e => {
    invoker.value(e); // 执行事件函数
  }
  invoker.value = value;

  return invoker;
}

/**
 * 1. 对事件函数的缓存;
 * 2. 判断缓存中是否存在对应的事件函数，而且没有 value（传入的事件函数）值，就绑定方法，并且缓存起来;
 * 3. 之前绑定过事件，就需要移除点;
 * 4. 如果之前绑定过事件，现在也绑定了，那就覆盖掉，修改掉 invoker 中的 value 属性所指向的新事件即可.
 * 事件绑定
 * @param el 元素
 * @param key 属性
 * @param value 值
 */
export const patchEvent = (el, key, value) => {
  // vue events invoke
  // 1. 需要缓存函数
  const invokers = el._vei || (el._vei = {});
  const exists = invokers[key];
  // 2. 如果事件是否已经存在
  if (value && exists) {
    exists.value = value;
  } else {
    const eventName = key.slice(2).toLowerCase();
    if (value) { // 之前没有绑定过事件，现在需要绑定
      const invoker = invokers[key] = createInvokey(value);
      el.addEventListener(eventName, invoker);
    } else { // 之前绑定过事件，但是没有 value （事件函数）
      el.removeEventListener(eventName, exists);
      invokers[key] = undefined;
    }
  }

}